#include "Server.h"

// 初始化静态互斥锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 顺序表
user_list *list = NULL;

// 用户连接线程
void *pthread_server(void *arg)
{
    /**************** 参数转换 ****************/
    int sock = *((int *)arg);

    /**************** 声明变量 ****************/
    int recv_size = 0;       //  读取到字符的长度
    char buf[1024];          //  读取 缓冲区
    char user_name[128];     //  用户名称
    char user_password[128]; //  用户密码
    user_data my_user;       //  用户信息结构体

    /**************** 登录/注册 ****************/
    while (1)
    {
        /**************** 接收数据 ****************/
        recv_size = recv(sock, buf, sizeof(buf), 0);

        if (recv_size == 0)
        {
            printf("客户端终止\n");
            close(sock);
            pthread_exit(NULL);
        }

        /**************** 注册 ****************/
        if (NULL != strstr(buf, "register "))
        {
            // 拆数据  从收到的信息中 提取 账号和密码
            sscanf(buf, "register %s %s end", user_name, user_password);

            // 向链表增加数据
            // 将数据写入到用户信息结构体
            strcpy(my_user.name, user_name);         // 写入姓名
            strcpy(my_user.password, user_password); // 写入密码
            my_user.sock = sock;                     // 写入套接字

            // 向链表插入数据
            pthread_mutex_lock(&mutex); // 上锁

            tail_insert_tail(list, my_user); //  插入

            pthread_mutex_unlock(&mutex); //  解锁

            continue; // 回到开始 进行登录
        }

        /**************** 登录 ****************/
        else if (NULL != strstr(buf, "log in "))
        {
            // 拆数据  从收到的信息中 提取 账号和密码
            sscanf(buf, "log in %s %s end", user_name, user_password);

            // 从链表查找数据
            // 将数据写入到用户信息结构体
            strcpy(my_user.name, user_name);         // 写入姓名
            strcpy(my_user.password, user_password); // 写入密码
            my_user.sock = sock;                     // 写入套接字
            // 判断账号密码是否正确
            if (find_Sql_list(list, my_user)) // 正确
            {
                send(sock, "登录成功", strlen("登录成功"), 0);
                break;
            }
            else // 错误
            {
                send(sock, "账号或密码错误", strlen("账号或密码错误"), 0);
                continue;
            }
        }
        /**************** 错误 ****************/
        else
        {
            send(sock, "**吧你 好好发", strlen("**吧你 好好发"), 0);
            continue;
        }
    }

    // 调用群发函数
    send_all(my_user);
}

// 群发 不发给自己
void send_all(user_data my_user)
{
    /**************** 声明变量 ****************/
    int recv_size = 0;       //  读取到字符的长度
    char buf_recv[1024];     //  读取 缓冲区
    char buf_send[1024];     //  发送 缓冲区
    char user_name[128];     //  用户名称
    char user_password[128]; //  用户密码

    // 开始运行
    while (1)
    {
        memset(buf_recv, 0, sizeof(buf_recv));

        recv_size = recv(my_user.sock, buf_recv, sizeof(buf_recv), 0);
        // 判断退出
        if (recv_size == 0)
        {
            // 用户退出 删除用户
            pthread_mutex_lock(&mutex);     // 上锁
            pos_del_list(list , my_user);
            pthread_mutex_unlock(&mutex);    //  解锁
            // 关闭文件
            close(my_user.sock);
            return;
        }

        // 群发
        pthread_mutex_lock(&mutex); // 上锁

        for (size_t i = 0; i < list->len; i++)
        {
            // 组装 发送字符串
            printf("111111\n");
            memset(buf_send, 0, sizeof(buf_send));

            sprintf(buf_send, "%s:%s", my_user.name, buf_recv);
            // 发送
            if (!strcmp(my_user.name , list->data[i].name))
            {
                // 是我自己 跳过
                continue;                   
            }
            send(list->data[i].sock, buf_send, strlen(buf_send), 0);
        }

        pthread_mutex_unlock(&mutex); //  解锁
    }
}
